replace-in-files
Replace text in one or more files or globs. Works asynchronously with promises.
Installation
# Using npm
npm install replace-in-files
# Using yarn
yarn add replace-in-files
Usage
Specify options
const replaceInFiles = require('replace-in-files');
const options = {
files: 'path/to/file',
files: [
'path/to/file',
'path/to/other/file',
'path/to/files/*.html',
'another/**/*.path',
],
from: /foo/g,
to: 'bar',
optionsForFiles: {
"ignore": [
"**/node_modules/**"
]
}
saveOldFile: false
encoding: 'utf8',
shouldSkipBinaryFiles: true,
onlyFindPathsWithoutReplace: false
returnPaths: true
returnCountOfMatchesByPaths: true
};
Replacing multiple occurrences
Please note that the value specified in the from
parameter is passed straight to the native String replace method. As such, if you pass a string as the from
parameter, it will only replace the first occurrence.
To replace multiple occurrences at once, you must use a regular expression for the from
parameter with the global flag enabled, e.g. /foo/g
.
Asynchronous replacement with promises
const replaceInFiles = require('replace-in-files');
replaceInFiles(options)
.then(({ changedFiles, countOfMatchesByPaths }) => {
console.log('Modified files:', changedFiles);
console.log('Count of matches by paths:', countOfMatchesByPaths);
console.log('was called with:', options);
})
.catch(error => {
console.error('Error occurred:', error);
});
Asynchronous replacement with co yield
const replaceInFiles = require('replace-in-files');
const co = require('co');
co(function* () {
const {
changedFiles,
countOfMatchesByPaths,
replaceInFilesOptions
} = yield replaceInFiles(options);
console.log('Modified files:', changedFiles);
console.log('Count of matches by paths:', countOfMatchesByPaths);
console.log('was called with:', replaceInFilesOptions);
}).catch((error) => {
console.log('Error occurred:', error);
});
Asynchronous replacement with async await (node 8+)
const replaceInFiles = require('replace-in-files');
async function main() {
try {
const {
changedFiles,
countOfMatchesByPaths,
replaceInFilesOptions
} = await replaceInFiles(options);
console.log('Modified files:', changedFiles);
console.log('Count of matches by paths:', countOfMatchesByPaths);
console.log('was called with:', replaceInFilesOptions);
} catch (error) {
console.log('Error occurred:', error);
}
}
main();
Sequentially replacement
use .pipe - will be replaced with only files found at first replacement
.pipe supported only: { from, to } (the other options will be received from options in the first replacement)
const replaceInFiles = require('replace-in-files');
async function main() {
try {
const {
changedFiles,
countOfMatchesByPaths,
replaceInFilesOptions
} = await replaceInFiles(options)
.pipe({ from: 'foo', to: 'bar' })
.pipe({ from: 'first', to: 'second' })
.pipe({ from: /const/g, to: () => 'var' });
console.log('Modified files:', changedFiles);
console.log('Count of matches by paths:', countOfMatchesByPaths);
console.log('was called with:', replaceInFilesOptions);
} catch (error) {
console.log('Error occurred:', error);
}
}
main();
Return value
The return value of the library is an object with: countOfMatchesByPaths and paths
For example:
const replaceInFiles = require('replace-in-files');
const data = replaceInFiles({
files: 'path/to/files/*.html',
from: 'a',
to: 'b',
});
{
countOfMatchesByPaths: [
{
'path/to/files/file1.html': 5,
'path/to/files/file3.html': 1,
'path/to/files/file5.html': 3
}
],
paths: [
'path/to/files/file1.html',
'path/to/files/file3.html',
'path/to/files/file5.html',
],
replaceInFilesOptions: [
{
files: 'path/to/files/*.html',
from: 'a',
to: 'b',
}
]
}
{
countOfMatchesByPaths: [
{}
],
paths: []
}
{
countOfMatchesByPaths: [
{
'path/to/files/file1.html': 5,
'path/to/files/file3.html': 1,
'path/to/files/file5.html': 3
},
{
'path/to/files/file5.html': 4
},
{
'path/to/files/file1.html': 2,
'path/to/files/file5.html': 4
}
],
paths: [
'path/to/files/file1.html',
'path/to/files/file3.html',
'path/to/files/file5.html',
],
replaceInFilesOptions: [
{
files: 'path/to/files/*.html',
from: 'a',
to: 'b',
},
{
from: 'c',
to: 'd',
},
{
from: 'e',
to: 'f',
}
]
}
Version information
Replace in files requires Node 12 or higher. (v.3.0.0 +) potentially still supported earlier node, but in pipeline eslint required node >=12
Replace in files requires Node 8 or higher. (v.2.0.3) - potentially still supported node 6, but in pipeline eslint required node 8
Replace in files requires Node 6 or higher. (v.1.1.4)
License
(MIT License)